package menu;

import iterator.Iterator;

import java.util.Scanner;

import ordered.Cursor;
import ordered.OrderedListAsDoubleLinkedList;
import ordered.PrintingVisitor;

import wrapper.Str;
import enumeration.Enumeration;

public class OrderedListMenu {
	private OrderedListAsDoubleLinkedList list;

	public void show(OrderedListAsDoubleLinkedList list) {
		this.list = list;
		try {
			while (executeFunction(callMenu()))
				;
		} catch (NoSuchOptionException e) {
			e.printStackTrace();
		}
	}

	public Integer callMenu() {
		System.out.println("\n*********************************************\n");
		System.out.println("Selecione uma opção");
		System.out.println("1: Insert");
		System.out.println("2: Withdraw");
		System.out.println("3: Insert Before");
		System.out.println("4: Insert After?");
		System.out.println("5: Is Member");
		System.out.println("6: Purge");
		System.out.println("7: Print OrderedListAsDoubleLinkedList (Visitor)");
		System.out.println("8: Print OrderedListAsDoubleLinkedList (Iterator)");
		System.out.println("9: Print OrderedListAsDoubleLinkedList (Enumeration)");
		System.out.println("0: Exit");
		Scanner entrada = new Scanner(System.in);
		String option = entrada.nextLine();
		return new Integer(option);
	}

	public boolean executeFunction(Integer option) throws NoSuchOptionException {
		Scanner entrada = new Scanner(System.in);
		switch (option) {
		case 0:
			return false;
		case 1:
			System.out.println("Digite o valor a ser inserido na pilha:");
			Str valor = new Str(entrada.next());
			list.insert(valor);
			break;
		case 2:
			System.out.println("Digite o valor a ser removido na pilha:");
			Str valor2 = new Str(entrada.next());
			Cursor cursor = list.findPosition(valor2);
			cursor.withdraw();
			break;
		case 3:
			System.out.println("Digite o valor a ser inserido:");
			Str valorInserido = new Str(entrada.next());
			System.out.println("Este valor deverá inserido antes de que outro valor?");
			Str valorReferencia = new Str(entrada.next());
			Cursor cursorInsertBefore = list.findPosition(valorReferencia);
			if(cursorInsertBefore != null)
			{
				cursorInsertBefore.insertBefore(valorInserido);
			}
			break;
		case 4:
			System.out.println("Digite o valor a ser inserido:");
			Str valorInserido2 = new Str(entrada.next());
			System.out.println("Este valor deverá inserido depois de que outro valor?");
			Str valorReferencia2 = new Str(entrada.next());
			Cursor cursorInsertAfter = list.findPosition(valorReferencia2);
			if(cursorInsertAfter != null)
			{
				cursorInsertAfter.insertAfter(valorInserido2);
			}
			break; 
		case 5:
			System.out.println("Digite o valor a ser procurado:");
			Str valorProcurado = new Str(entrada.next());
			if(list.isMember(valorProcurado))
				System.out.println("Valor encontrado na lista.");
			else System.out.println("Valor não encontrado na lista.");
			break;
		case 6:
			System.out
					.println("A pilha foi reiniciada e todos seus elementos removidos.");
			list.purge();
			break;
		case 7:
			System.out.println("Elementos da pilha: ");
			list.accept(new PrintingVisitor());
			break;
		case 8:
			Iterator iterator = list.getIterator();
			for (iterator.init(); iterator.test(); iterator.inc())
				System.out.println(((Str)iterator.current()).getValue());
			break;
		case 9:
			Enumeration enumeration = list.getEnumeration();
			while (enumeration.hasMoreElements()) {
				System.out.println(((Str)enumeration.nextElement()).getValue());
			}
			break;
		default:
			throw new NoSuchOptionException("Opção invalida");
		}
		return true;
	}
}
